# ---- 第一阶段：构建阶段 (Builder Stage) ----
# 使用一个包含完整构建工具链的 Node.js 镜像作为基础
# 使用明确的版本号是一个好习惯，可以保证构建的可复现性
FROM node:18-alpine AS builder

# 设置工作目录
WORKDIR /app

# 优化缓存：只拷贝 package.json 和 package-lock.json
# 这样只有在依赖更新时，才会重新执行 npm install，而不是每次代码变更都执行
COPY package*.json ./

# 安装生产环境依赖
RUN npm ci --only=production

# 拷贝所有应用源代码
COPY . .

# 如果有构建步骤（例如 TypeScript 编译、前端资源打包），在这里执行
# RUN npm run build


# ---- 第二阶段：生产阶段 (Production Stage) ----
# 使用一个非常轻量的 Node.js 镜像作为最终运行环境，减小镜像体积
FROM node:18-alpine

WORKDIR /app

# 安全实践：创建一个非 root 用户来运行应用
RUN addgroup -S appgroup && adduser -S appuser -G appgroup

# 从“构建阶段”拷贝已经安装好的依赖
# --chown=appuser:appgroup 可以在拷贝的同时设置文件所有者，非常方便
# COPY --from=builder --chown=appuser:appgroup /app/node_modules ./node_modules

# 从“构建阶段”拷贝应用源代码
COPY --from=builder --chown=appuser:appgroup /app/src ./src

# 切换到我们创建的非 root 用户
USER appuser

# 暴露应用监听的端口
EXPOSE 3000
# ... (在 EXPOSE 之后)

# 健康检查：每30秒检查一次，超时5秒，重试3次
# 如果你的应用没有 curl，可以使用 wget
HEALTHCHECK --interval=30s --timeout=5s --start-period=10s --retries=3 \
  CMD curl -f http://localhost:3000/health || exit 1

# 定义容器启动时执行的命令
CMD [ "node", "src/index.js" ]